using System;
using Csla;
using Ent.AccesoDatos;
using System.Collections.Generic;
using System.Data;

namespace EntGuayasSLA.BL
{
    [Serializable]
    public class DocumentoExpediente : BusinessBase<DocumentoExpediente>
    {
        #region Business Methods
      
        public static readonly PropertyInfo<Guid> IdProperty = RegisterProperty<Guid>(c => c.Id);
        public Guid Id
        {
            get { return GetProperty(IdProperty); }
            set { SetProperty(IdProperty, value); }
        }
        public static readonly PropertyInfo<string> IdArchivoProperty = RegisterProperty<string>(c => c.IdArchivo);
        public string IdArchivo
        {
            get { return GetProperty(IdArchivoProperty); }
            set { SetProperty(IdArchivoProperty, value); }
        }
        
        public static readonly PropertyInfo<DateTime> FechaProperty = RegisterProperty<DateTime>(c => c.Fecha);
        public DateTime Fecha
        {
            get { return GetProperty(FechaProperty); }
            set { SetProperty(FechaProperty, value); }
        }   
        public static readonly PropertyInfo<string> JefaturaProperty = RegisterProperty<string>(c => c.Jefatura);
        public string Jefatura
        {
            get { return GetProperty(JefaturaProperty); }
            set { SetProperty(JefaturaProperty, value); }
        }
       
        #endregion

        #region Business Rules

        protected override void AddBusinessRules()
        {
            // TODO: add validation rules
            base.AddBusinessRules();
            //BusinessRules.AddRule(new Rule(IdProperty));
        }

        private static void AddObjectAuthorizationRules()
        {
            // TODO: add authorization rules
            //BusinessRules.AddRule(...);
        }

        #endregion

        #region Factory Methods
        /// <summary>
        /// Busqueda por identificador de archivo
        /// </summary>
        /// <param name="idArchivo"></param>
        /// <returns></returns>
        public static DocumentoExpediente GetEditableRoot(string idArchivo)
        {
            return DataPortal.Fetch<DocumentoExpediente>(idArchivo);
        }
        public static DocumentoExpediente GetEditableRoot(Guid id)
        {
            return DataPortal.Fetch<DocumentoExpediente>(id);
        }

        

        private DocumentoExpediente()
        { /* Require use of factory methods */ }

        #endregion

        #region Data Access

        [RunLocal]
        protected override void DataPortal_Create()
        {
            // TODO: load default values
            // omit this override if you have no defaults to set
            base.DataPortal_Create();
        }

        private void DataPortal_Fetch(Guid criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_exp_id", criteria.ToString()) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_DOC_EXP\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                LoadPropertys(datos);
               
            }
        }

        private void LoadPropertys(DataSet datos)
        {
            //                                      
            LoadProperty(IdProperty, Guid.Parse(datos.Tables[0].Rows[0]["exp_id"].ToString()));
            LoadProperty(IdArchivoProperty, datos.Tables[0].Rows[0]["arc_id"].ToString());
            LoadProperty(FechaProperty, Convert.ToDateTime(datos.Tables[0].Rows[0]["dex_fecha"].ToString()));
            LoadProperty(JefaturaProperty, datos.Tables[0].Rows[0]["dex_jefatura"].ToString());
        }
        //
        private void DataPortal_Fetch(string criteria)
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { new Parametro("ec_arc_id", criteria.ToString()) };
            DataSet datos = accesoDatos.EjecutarDataSet("\"OBT_DOC_EXP_ARCH\"", parametros);
            if (datos.Tables[0].Rows.Count > 0)
            {
                LoadPropertys(datos);

            }
        }

        [Transactional(TransactionalTypes.TransactionScope)]
        protected override void DataPortal_Update()
        {
            var accesoDatos = new DriveDataBase(TypeDataBase.PostgreSql);
            var parametros = new List<Parametro> { 
                new Parametro("ec_exp_id", ReadProperty(IdProperty)),  
                new Parametro("ec_arc_id", ReadProperty(IdArchivoProperty)),
                new Parametro("ef_dex_fecha", ReadProperty(FechaProperty)),
                new Parametro("ec_dex_jefatura", ReadProperty(JefaturaProperty))              
            };
            accesoDatos.EjecutarQuery("\"ACT_DOC_EXP\"", parametros);
        }

       

       

        #endregion
    }
}
